﻿// poj3185 水碗.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>

using namespace std;
/*
* http://poj.org/problem?id=3185
水碗
时间限制：1000MS 内存限制：65536K
总提交量。9312 被接受。3638
说明

奶牛有一排20个水碗，它们从里面喝水。水碗可以是朝上的（方向正确，可以提供清凉的水）或朝下的（没有水的位置）。
它们希望所有的20个水碗都是正面朝上的，因此用它们宽大的鼻子来翻转碗。

不过，它们的鼻子很宽，不仅能翻转一个碗，还能翻转该碗两侧的碗（总共有三个或--如果是两端的碗--两个碗）。

考虑到碗的初始状态（1=不能喝，0=能喝--它甚至看起来像个碗），要把所有的碗都翻过来，最少需要翻多少个碗？
输入

第1行。一个有20个空格分隔的整数的单行
输出

第1行。将所有的碗翻转到右边（即翻转到0）所需的最小碗数。对于给定的输入，总是有可能找到一些翻转的组合，将碗翻到20个0。
输入样本

0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0
输出样本

3
提示

样本的解释。

翻转4号、9号和11号碗，使它们都可以喝。
0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 [初始状态]
0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 [翻转碗4后]
0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 [翻转碗9后] 。
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [翻转碗11后]
*/


const int N = 20;
int arr[N];
int ans;

void turn(int idx) {
	if (idx - 1 >= 0 && idx - 1 < 20) { arr[idx - 1] ^= 1; }
	if (idx >= 0 && idx < 20) { arr[idx] ^= 1; }
	if (idx + 1 < 20 && idx + 1 >= 0) { arr[idx + 1] ^= 1; }
}


void dfs(int idx,int optcnt) {
	if (idx >= 20) {
		if (optcnt >= ans) return;
		for (int i = 0; i < 20; i++) {
			if (arr[i] == 1) { return; }
		}
		ans = optcnt; return;
	}

	dfs(idx + 1, optcnt);
	if (idx == 3 || idx == 8 || idx == 10) {
		int dee = 21;
	}
	turn(idx);
	dfs(idx + 1, optcnt + 1);
	turn(idx);

	return;
}

void solve() {
	dfs(0,0);

	cout << ans << endl;
	return ;
}

int main()
{
	ans = 0x3f3f3f3f;
	for (int i = 0; i < 20; i++) { cin >> arr[i]; }
	solve();

	return 0;
}

 